import socket
import threading

from user_oper import *
import sys
"""
客户端也是一个socket套接字对象，但是客户端不需要绑定端口，用系统随机分配的端口
"""
class Client(object):
    def __init__(self,port):
        self.__port = port
        self.__client_socket = None # 客户端的socket

    def client_start(self):
        # 客户端创建基于TCP的
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 客户端不需要绑定端口，用系统随机分配的  绑定也行
        client.bind(("192.168.1.2",self.__port))
        # 客户端基于TCP协议连接服务端
        client.connect(("192.168.1.2",8889))
        # 把当前客户端的socket缓存起来的
        self.__client_socket = client
        print("===============客户端连接服务端成功==================")
        # 启动一个多线程，接受服务端发送的消息
        thread = threading.Thread(target=self.receiver_server_msg,args=(client,))
        thread.start()

    # 函数代表客户端用来接受服务端的多线程代码
    def receiver_server_msg(self,client_socket):
        while True:
            # 接受服务端返回的数据
            result = client_socket.recv(5*1024)
            line = result.decode("utf-8")
            li = line.split(",")
            match li[0]:
                case "3":
                    print(li[1])
                case "4":
                    status = li[1]
                    if status == "ok":
                        threading.Thread(target=self.second_menu,args=()).start()
                    else:
                        print(li[2])
                        self.first_menu()
                case _:
                    print(line)

    def first_menu(self):
        print("===============1、登录 2、注册  3、退出=============")
        menu_id = input("请输入选项：")
        match menu_id:
            case "1":
                login(self.__client_socket)
            case "2":  # 注册
                register(self)
            case "3":
                print("欢迎再次使用！")
                sys.exit()
            case _:
                print("暂无该选项！")
                self.first_menu()

    def second_menu(self):
        print("1、群聊 2、私聊 3、退出")
        menu_id = input("请输入你的选择")
        match menu_id:
            case "1":
                msg = input("请输入你的消息：")
                self.__client_socket.send(f"1,{msg}".encode("utf-8"))
                self.second_menu()
            case "2":
                username = input("请输入好友账号：")
                msg = input("请输入消息：")
                self.__client_socket.send(f"2,{username},{msg}".encode("utf-8"))
                self.second_menu()
            case "3":
                sys.exit()
            case _:
                print("暂无该选项")
                self.second_menu()

    @property
    def client_socket(self):
        return self.__client_socket



if __name__ == "__main__":
    # 创建一个客户端对象 绑定60000端口
    client = Client(60000)
    # 调用client_start()函数启动客户端socket，目的是为了和服务端通信
    client.client_start()
    # 渲染一个菜单
    client.first_menu()



